/**
 * JSparrow - Une version numérique du jeu "Attention Pirates !" - Copyright (C) 2014 Black Pearl
 *
 * This program is free software: you can redistribute it and/or modify it under the terms of the
 * GNU General Public License as published by the Free Software Foundation, either version 3 of the
 * License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
 * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 * General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License along with this program. If
 * not, see <http://www.gnu.org/licenses/>.
 */
package App.Vue;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Point;
import java.util.Arrays;

public class Vue_Case {

	private String[] positions;
	public int BORDERS = 0;
	private int l;
	private int h;
	private int r;
	private int s;
	private int t;

	/**
	 * Gère une case du plateau, dessine les bateaux et les localise
	 * @param hauteur hauteur d'une case
	 */
	public Vue_Case(int hauteur){
		positions = new String[6];
		l = hauteur/10;
		setHeight(hauteur);
		//initialisation
		for(int i=0;i<6;i++){
			positions[i] = new String("");
		}		
	}

	/**
	 * Ajoute un bateau de la case
	 * @param couleur Couleur du bateau à ajouter ex "0"
	 */
	public void addBateau(String couleur){
		for(int i=0;i<6;i++){
			if(positions[i].isEmpty()){//Ajoute au premier emplacement dispo
				positions[i] = couleur;
				i=7;
			}
		}
	}

	/**
	 * Supprime un bateau de la case
	 * @param couleur Couleur du bateau à supprimer
	 */
	public void delBateau(String couleur){
		for(int i=0;i<6;i++){
			if(positions[i].equals(couleur)){
				positions[i] = "";
				i=7;
			}
		}
	}

	/**
	 * Paramètre les dimensions d'un hexagon en fonction de sa hauteur
	 * @param height hauteur de l'hexagone
	 */
	public void setHeight(int height) {
		h = height;			// h = basic dimension: height (distance between two adj centresr aka size)
		r = h/2;			// r = radius of inscribed circle
		s = (int) (h / 1.73205);	// s = (h/2)/cos(30)= (h/2) / (sqrt(3)/2) = h / sqrt(3)
		t = (int) (r / 1.73205);	// t = (h/2) tan30 = (h/2) 1/sqrt(3) = h / (2 sqrt(3)) = r / sqrt(3)
	}

	/**
	 * Dessine les bateau de la case
	 * @param g Support
	 * @param i Abscisse de la grille
	 * @param j Ordonnées de la grille
	 */
	public void drawCase(Graphics g, int i, int j){
		int x = i * (s+t);
		int y = j * h + (i%2) * h/2;
		Point[] p = getHexagon(x, y);
		for(int k = 0;k<6;k++){
			if(!positions[k].isEmpty()){
				g.setColor(getCouleur(positions[k]));
				g.fillOval(p[k].x, p[k].y, l, l*2);
			}
		}

	}

	/**
	 * Donne un hexagone pour placer les bateau sur le graph
	 * @param x0 abscisse de la grille
	 * @param y0 ordonnée e la grille
	 * @return un hexagone(polygon)
	 */
	public Point[] getHexagon (int x0, int y0) {

		int y = y0 + BORDERS;
		int x = x0 + BORDERS; 
		Point[] p;

		if (s == 0  || h == 0) {
			System.out.println("ERROR: size of hex has not been set");
		}

		p =  new Point[]{new Point(x+t,y+l),new Point(x+s+t-l,y+l)
		,new Point(x+s+t+t-2*l,y+r-l),new Point(x+s+t-l,y+r+r-3*l)
		,new Point(x+t,y+r+r-3*l),new Point(x+l,y+r-l)};
		return p;
	}

	/**
	 * 
	 * @param couleur nom de la couleur en fr
	 * @return Color correspondante
	 */
	public Color getCouleur(String couleur){

		switch(couleur){
		case "4" : 
			return Color.RED;
		case "1" :
			return Color.BLUE;
		case "0":
			return Color.WHITE;
		case "3" :
			return Color.ORANGE;
		case "5" :
			return new Color(200, 0, 255);
		case "2" :
			return Color.YELLOW;
		default :
			return Color.BLACK;
		}
	}

	/**
	 * Indique si un bateau est présent
	 * @param x abscisse de la case
	 * @param y ordonnées de la case
	 * @param clic point du clic
	 * @return "" si aucun bateau, "couleur" du bateau sinon
	 */
	public String haveBateau(int x, int y, Point clic){
		String bateau = new String("");
		Point[] p = getHexagon(x, y);
		int x0 = x * (s+t);
		int y0 = y * h + (x%2) * h/2; 
		for(int i=0;i<6;i++){
			//Si le clic est sur un emplacement
			if((clic.x>=p[i].x+x0)&&(clic.x<=p[i].x+x0+l) 
					&& (clic.y>=p[i].y+y0)&&(clic.y<=p[i].y+y0+2*l)){
				bateau = positions[i];
				i=7;
			}
		}
		return bateau;
	}

	@Override
	public String toString() {
		return "Vue_Case [positions=" + Arrays.toString(positions) + "]";
	}


}
